import { app, shell, BrowserWindow, Tray, Menu, dialog, ipcMain } from 'electron'
import { autoUpdater } from 'electron-updater'
import log from 'electron-log'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import appLoaded from './custom-event' // 引入自定义的事件内容
import icon from '../../resources/icon.png?asset' // 引用静态资源需要在文件名后面加上?asset
let mainWindow = null // 主窗口的实例
let tray = null // 托盘的实例
// 创建窗口
function createWindow() {
    // 创建浏览器窗口。
    mainWindow = new BrowserWindow({
        width: 900,
        height: 670,
        minWidth: 900, // 设置最小宽度
        minHeight: 670, // 设置最小高度
        // frame: false, // 隐藏窗口的原生标题栏
        show: false, // 是否显示窗口
        autoHideMenuBar: true, // 隐藏菜单栏
        // 在linux系统下使用icon图标  ---- 在windows系统下使用icon只会在yarn dev时生效，打包后不会生效，需要在electron-builder.yml中配置
        ...(process.platform === 'linux' ? { icon } : { icon }),
        webPreferences: {
            contextIsolation: true, // 上下文隔离
            nodeIntegration: false, // Node.js 集成
            preload: join(__dirname, '../preload/index.js'), // 预加载脚本
            sandbox: false // 沙箱模式 --- 开启后会导致electron-store无法使用
        }
    })

    mainWindow.on('ready-to-show', () => {
        mainWindow.show()
    })

    mainWindow.webContents.setWindowOpenHandler((details) => {
        // 打开外部链接。
        shell.openExternal(details.url)
        return { action: 'deny' }
    })

    // 根据 electron-vite cli 进行渲染进程的 HMR（热模块替换）。
    // 在开发中加载远程 URL，生产中加载本地 HTML 文件。
    if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
        mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
    } else {
        // 加载应用的 index.html,并且启动hash路由
        mainWindow.loadFile(join(__dirname, '../renderer/index.html'), { hash: 'home' })
    }
}
// 创建托盘
function createTray() {
    // 创建托盘的实例并设置托盘图标
    tray = new Tray(icon)
    // 创建托盘菜单
    const contextMenu = Menu.buildFromTemplate([
        {
            label: '主页面',
            click: () => {
                mainWindow.show() // 点击的时候显示主窗口
            }
        },
        {
            label: '退出',
            click: () => {
                app.quit() // 点击的时候退出应用
            },
            icon: join(__dirname, '../../resources/close.png')
        }
    ])
    // 设置托盘悬浮提示
    tray.setToolTip('electron应用')
    // 设置托盘菜单
    tray.setContextMenu(contextMenu)
    //单击右下角小图标显示应用
    tray.on('click', () => {
        mainWindow.show()
    })
}

// 执行更新计划
function appUpdater() {
    // 检测是否有新版本
    autoUpdater.checkForUpdates()
    autoUpdater.on('error', (error) => {
        console.info('error', error)
    })

    autoUpdater.on('checking-for-update', (res) => {
        console.info('获取版本信息:' + res)
        log.info('获取版本信息:' + res)
    })

    autoUpdater.on('update-not-available', (res) => {
        log.info('没有可更新版本:' + res)
    })
    autoUpdater.on('update-available', (res) => {
        log.info('可以更新版本:' + res)
    })

    autoUpdater.on('download-progress', (res) => {
        log.info('下载监听:' + res)
    })

    autoUpdater.on('update-downloaded', () => {
        log.info('下载完成:')
        dialog
            .showMessageBox({
                title: '下载完成',
                message: '最新版本已下载完成, 退出程序进行安装'
            })
            .then(() => {
                autoUpdater.quitAndInstall(true)
                // app.quit()
            })
    })
}

// 初始化app
function initApp() {
    const gotTheLock = app.requestSingleInstanceLock() // 是否为单例应用
    if (!gotTheLock) {
        // 检测到本次未取得锁，即有已存在的实例在运行，则本次启动立即退出，不重复启动。
        app.quit()
    } else {
        app.on('second-instance', () => {
            // 监听到第二个实例被启动时，检测当前实例的主窗口，并显示出来取得焦点
            if (mainWindow) {
                if (mainWindow.isMinimized()) mainWindow.restore()
                mainWindow.focus()
            }
        })
        // Electron 初始化完成后调用此方法以创建浏览器窗口
        app.whenReady().then(() => {
            // 为 Windows 设置应用程序用户模型 ID。
            electronApp.setAppUserModelId('com.electron')

            // 在开发中默认通过 F12 打开或关闭 DevTools，
            // 在生产中忽略 CommandOrControl + R 快捷键。
            // 详见 https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
            app.on('browser-window-created', (_, window) => {
                optimizer.watchWindowShortcuts(window)
            })

            createWindow() // 创建窗口

            createTray() // 创建托盘

            mainWindow && appLoaded(mainWindow) // 应用加载完成后执行的操作)

            // 在macOS上，当单击dock图标并且没有其他窗口打开时，
            // 通常在应用程序中重新创建一个窗口。
            app.on('activate', () => {
                // 在 macOS 中，当单击 dock 图标且没有其他窗口打开时，重新创建一个窗口。
                if (BrowserWindow.getAllWindows().length === 0) createWindow()
            })
        })
    }
    // 在所有窗口关闭后退出应用程序，但在 macOS 上除外。
    // 在 macOS 中，应用程序和其菜单栏通常会保持活动状态，直到用户使用 Cmd + Q 显式退出。
    app.on('window-all-closed', () => {
        if (process.platform !== 'darwin') {
            app.quit()
        }
    })

    // 在app结束之前，将所有的监听器显性干掉
    app.on('before-quit', () => {
        ipcMain.removeAllListeners()
    })
}

// 执行app
initApp()

// 在这个文件中，你可以包含其余应用程序特定的主进程代码。
// const isDevelopment = process.env.NODE_ENV === 'development'
